import DtoPostData from '../dto/DtoPostData.js'
import DtoQueryString from '../dto/DtoQueryString.js'
import DtoHeaders from '../dto/DtoHeaders.js'
import DtoCookies from '../dto/DtoCookies.js'

/**
 * Класс, описывающий структуру запроса
 */
export default class DtoRequest {
    /** @type {string} */
    method // TODO Сделать в виде отдельного класса констант

    /** @type {number} */
    headersSize

    /** @type {URL} */
    url

    /** @type {string} */
    httpVersion

    /** @type {DtoHeaders} */
    headers

    /** @type {DtoQueryString} */
    queryString

    /** @type {DtoCookies} */
    cookies

    /** @type {number} */
    bodySize

    /** @type {DtoPostData} */
    postData

    constructor(obj) {
        this.method = obj?.method !== undefined ? obj.method : null
        this.headersSize = obj?.headersSize !== undefined ? obj.headersSize : null
        this.url = obj?.url !== undefined ? new URL(obj.url) : null
        this.httpVersion = obj?.httpVersion !== undefined ? obj.httpVersion : null
        this.headers = obj?.headers !== undefined ? DtoHeaders.BuildFromObj(obj.headers, 'name', 'value') : null
        this.queryString = obj?.queryString !== undefined ? obj.queryString : null
        this.cookies = obj?.cookies !== undefined ? DtoCookies.BuildFromObj(obj.cookies) : null
        this.bodySize = obj?.bodySize !== undefined ? obj.bodySize : null
        this.postData = obj?.postData !== undefined ? DtoPostData.BuildFromObj(obj.postData) : null
    }

    /**
     * Создать экземпляр класса из аналогичного по структуре объекта
     * @param {object} obj объект запроса
     * @returns экземпляр класса DtoRequest
     */
    static BuildFromObj(obj) {
        return new DtoRequest(obj)
    }

    /** @type {string} */
    getMethod() {
        return this.method
    }

    /** @type {number} */
    getHeadersSize() {
        return this.headersSize
    }

    /** @type {URL} */
    getUrl() {
        return this.url
    }

    /** @type {string} */
    getHttpVersion() {
        return this.httpVersion
    }

    /** @type {DtoHeaders} */
    getHeaders() {
        return headers
    }

    /** @type {DtoQueryString} */
    getQueryString() {
        return this.queryString
    }

    /** @type {DtoCookies} */
    getCookies() {
        return this.cookies
    }

    /** @type {number} */
    getBodySize() {
        return this.bodySize
    }
}